package com.learn.elasticsearch.service;

import co.elastic.clients.elasticsearch._types.mapping.Property;
import co.elastic.clients.elasticsearch.core.IndexResponse;
import co.elastic.clients.elasticsearch.core.search.HitsMetadata;
import co.elastic.clients.elasticsearch.indices.IndexState;
import com.learn.elasticsearch.domain.EsPage;
import com.learn.elasticsearch.domain.TableDataInfo;

import java.io.IOException;
import java.util.List;
import java.util.Map;

/**
 * @description: java类作用描述
 * @author: MI
 * @email: 448341911@qq.com
 * @createTime: 2024/1/13 0:14
 * @updateUser: MI
 * @updateTime: 2024/1/13 0:14
 * @updateRemark: 修改内容
 * @version: v1.0
 */
public interface EsSearchService<T>  {

    /**
     * 判断索引是否存在
     *
     * @param indexName
     * @return
     * @throws IOException
     */
    boolean hasIndex(String indexName) throws IOException;

    /**
     * 查询索引详情
     *
     * @param indexName
     * @return
     * @throws IOException
     */
    Map<String, IndexState> queryIndex(String indexName);

    /**
     * 删除索引
     *
     * @param indexName
     * @throws IOException
     */
    boolean deleteIndex(String indexName);

    /**
     * 创建索引
     *
     * @param indexName
     * @return
     * @throws IOException
     */
    boolean createIndex(String indexName);

    /**
     * 重新创建索引,如果已存在先删除
     *
     * @param indexName
     * @param mapping
     */
    void reCreateIndex(String indexName, Map<String, Property> mapping);

    /**
     * 新增数据
     *
     * @param indexName
     * @param id        自己的主键标识
     * @throws IOException
     */
    String insertDocument(String indexName, Map<String, Object> obj, String id);

    /**
     * 修改数据
     *
     * @param indexName
     * @param id        自己的主键标识
     * @throws IOException
     */
    boolean updateDocument(String indexName, Map<String, Object> obj, String id);

    /**
     * 查询数据
     *
     * @param indexName
     * @param id
     * @return
     */
    Map searchDocument(String indexName, String id);

    /**
     * 删除数据
     *
     * @param indexName
     * @param id
     * @return
     */
    boolean deleteDocument(String indexName, String id);

    /**
     * 批量增加数据
     *
     * @param indexName
     * @return
     */
    boolean batchInsertDocument(String indexName, List<Map<String, Object>> objs);

    TableDataInfo searchTermDocumentList(String indexName, EsPage esPage);


    /**
     * 判断索引是否存在
     *
     * @param index 索引
     * @return boolean
     */
    boolean existsIndex(String index);

    /**
     * 创建索引
     *
     * @param index      索引
     * @param aliasename aliasename
     * @return boolean
     */
    boolean createIndex(String index, String aliasename, int numOfShards, Map<String, Property> properties);


    boolean deleteIndex(List<String> indexList);

    /**
     * 判断文档是否存在
     *
     * @param index index
     * @param id    id
     * @return boolean
     */
    boolean existsDocument(String index, String id, Class<T> clazz);

    /**
     * 保存文档
     * 如果文档存在则更新文档
     *
     * @param index index
     * @param id    id
     * @param qa    qa
     * @return IndexResponse
     */
    IndexResponse saveOrUpdateDocument(String index, String id, T qa);




    /**
     * 根据id获取文档
     *
     * @param index index
     * @param id    id
     * @param clazz clazz
     * @return T
     */
    T getById(String index, String id, Class clazz);

    /**
     * 根据id列表获取文档
     *
     * @param index  index
     * @param idList id
     * @param clazz  clazz
     * @return List<T>
     */
    List<T> getByIdList(String index, List<String> idList, Class clazz);

    /**
     * 分页查询
     *
     * @param index    index
     * @param pageNo   pageNo
     * @param pageSize pageSize
     * @param clazz    clazz
     * @return HitsMetadata<T>
     */
    HitsMetadata<T> searchByPages(String index, Integer pageNo, Integer pageSize, Class clazz);

    IndexResponse saveOrUpdateDocument(String index, Object t);

    /**
     * 根据id删除文档
     *
     * @param id id
     */
    boolean deleteById(String index, String id);
}
